/*实用工具的实现*/
#ifndef __M_UTIL_H_//防止头文件的重复包含
#define  __M_UTIL_H_
#include<iostream>
#include<ctime>
#include<string>
#include<sys/stat.h>
#include<unistd.h>
//实现的主要功能有以下几点
//查看文件是否存在
//返回文件的存储路径
//根据路径创建目录
//实现一个共嗯那个就测试一个功能
namespace bitlog //自创命名空间，工程化实现，防止与其他文件命名冲突
{
	namespace util
	{
		class Date//所用函数全部使用static实现，不用实例化出对象
		{
		public:
			static size_t get_time()//获取时间函数
			{
				return (size_t)time(nullptr);
			}
		};
		class File
			{
			public:
				static bool exists(const std::string &pathname)
				{
					//return (access(pathname.c_str(),F_OK==0));//access函数是判断文件名的函数，但可移植性不太好
                    //可以使用另一个函数
					struct stat st;
					if(stat(pathname.c_str(),&st)<0)
					{
						return false;
					}
					return true;
				}//判断文件名是否存在
				static std::string filepath(const std::string &pathname)
                {
                    size_t pos = pathname.find_last_of("/\\");//截取文件名字，查找斜杠或者反斜杠
                    if(pos==std::string::npos)//没找到
                    	return ".";
                    return pathname.substr(0,pos+1);
                }//返回文件的存储路径
				static void createDirctory(const std::string &pathname)//根据返回路径创建一个目录
				{
					//以./abc/def/ghk为例子
					size_t pos = 0,idx=0;//查找文件目录，pos表示斜杠位置
					while(idx<pathname.size())
					{
					pos = pathname.find_first_of("/\\",idx);
					if(pos==std::string::npos)
					{
						mkdir(pathname.c_str(),0777);//创建文件函数,0777表示给予全部权限
					}
					std::string parent_dir = pathname.substr(0,pos + 1);
					if(exists(parent_dir)==true)//如果此时上级目录存在，就跳过循环
					{
						idx = pos + 1;
						continue; 
					}
					mkdir(parent_dir.c_str(),0777);
					idx = pos+1;
					}
				}
			};
	}
}

#endif